我們今天來看 machine.Timer 模組。
Timer 顧名思義,是計時器或是定時器的意思,我們可以設定一個時間,當時間到了,可以執行我們預先設定的動作,Micropython官方給的例子如下:
from machine import Timer
tim0 = Timer(0)
tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0))
tim1 = Timer(1)
tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1))
官方文件說 Timer(id)
裡的 id
的數值爲 0 ~ 3, 若是 -1 表示爲軟體的 Timer, 這個部分,我們明天再詳細的實驗說明。
這個例子很簡單,用了兩個 Timer 變數:tim0 與 tim1。
tim0 在初始化的時候,帶入了幾個參數(或者稱爲引數也行),period 這個 KW (keyword) 參數, 指明是一個時間,單位是 ms (千分之一秒),這裡 5000 就是 5 秒的意思。
mode 這裡指明的是 ONE_SHOT, 也就是說,當 period 指定的時間到了之後,會去執行 一次 後面 callback 參數所指明的 callback function (回 call 函數)。
這裡 callback function 使用了 lambda 匿名函數,帶入物件(或者參數) t , 執行 print(0) 這個動作。其實這個 t 應該是要帶入一個 Timer 物件,我們之後會說明。
tim1 用了 PERIODIC, 這代表週期重覆的意思,也就是每隔 2 秒,執行 print(1)
這個動作,一直重覆下去。
程式的結果如下:
1
1
0
1
1
1
......
我們發現如預期的,每 2 秒印出 1,在第 5 秒的時候,印出 0 一次。
我們前面使用了 sleep 延時的功能,來實現產生 10,100,1000 Hz 頻率的波形,其實這就是所謂的變頻或調頻
我們用 Timer 來實現 LED 閃爍的例子:
from machine import Pin,Timer
LED = Pin(1, Pin.OUT)
tim = Timer(0)
tim.init(period = 50, mode = Timer.PERIODIC, callback = lambda t: LED.value(not LED.value()))
這樣就產生 10 Hz 的 LED 閃爍。
您可以比對一下之前用 sleep 延時的方法,用 Timer 是否變成簡單許多了呢? 而且還是多工的!在 LED 閃爍的執行中,我們還可以做其它事,不會影響閃爍的頻率。
至於產生 100 Hz, 1000 Hz的閃爍,就給您當作業了!